package com.qcloud.weapp.tunnel;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 原生信道房间扩展,有Array保存信道列表改为Map保存
 * 房间维护一批信道的集合，可以通过广播方法向房间里的所有信道推送消息
 * */
public class TunnelRoomMap {

	private Map<String,Tunnel> tunnels;

	/**
	 * 实例化一个信道房间，初始包含指定的信道集合
	 * */
	public TunnelRoomMap(ArrayList<Tunnel> tunnels) {
		if (tunnels == null) {
			tunnels = new ArrayList<Tunnel>();
		}
		this.tunnels = new HashMap<>();
		for (Tunnel tunnel : tunnels) {
			this.tunnels.put(tunnel.getTunnelId(),tunnel);
		}
	}

	/**
	 * 实例化一个信道房间，初始不包含任何信道
	 * */
	public TunnelRoomMap() {
		this(new ArrayList<Tunnel>());
	}
	
	/**
	 * 向房间里添加信道
	 * @param tunnel 要添加的信道
	 * */
	public void addTunnel(Tunnel tunnel) {
		this.tunnels.put(tunnel.getTunnelId(),tunnel);
	}
	
	/**
	 * 从房间移除指定的信道
	 * @param tunnel 要移除的信道
	 * */
	public void removeTunnel(Tunnel tunnel) {
		this.tunnels.remove(tunnel.getTunnelId());
	}

	
	/**
	 * 获取房间里信道的数量
	 * */
	public int getTunnelCount() {
		return this.tunnels.size();
	}
	
	/**
	 * 向房间里的每一个信道广播消息
	 * @param messageType 要广播的消息的类型
	 * @param messageContent 要广播的消息的内容
	 * */
	public EmitResult broadcast(String messageType, Object messageContent) throws EmitError {
		TunnelAPI api = new TunnelAPI();
		return api.emitMessage(tunnels.values().toArray(new Tunnel[] {}), messageType, messageContent);
	}

	/**
	 * 向房间里的指定信道广播消息
	 * @param messageType 要广播的消息的类型
	 * @param messageContent 要广播的消息的内容
	 * @param tunnelIds 指定广播的信道
	 * */
	public EmitResult broadcast(String messageType, Object messageContent,String... tunnelIds) throws EmitError {
		TunnelAPI api = new TunnelAPI();
		if (null != tunnelIds && tunnelIds.length > 0){
			List<Tunnel> tunnels = new ArrayList<>();
			for (String tunnelId : tunnelIds) {
				if (this.tunnels.containsKey(tunnelId)) {
					tunnels.add(this.tunnels.get(tunnelId));
				}
			}
			return api.emitMessage(tunnels.toArray(new Tunnel[] {}), messageType, messageContent);
		}
		return new EmitResult(new ArrayList<>());
	}
}
